Global strict loading mode setting, route draw deferring and more | This Week in Rails
https://rubyonrails.org/2024/6/4/Rails-Versions-6-1-7-8-7-0-8-4-and-7-1-3-4-have-been-released
Ruby on Rails — Rails Versions 6.1.7.8, 7.0.8.4, 7.1.3.4, and 7.2.0.beta2 have been released!
Railsのセキュリティリリースがあったというお知らせです
各位バージョンアップしましょう
RubyConf 2024: Call for Speakers @ Sessionize.com
RubyConf 2024のスピーカーの募集が始まりました
RubyConf 2024は2024年11月13日(水)〜15日(金)にシカゴで開催されます
スピーカーの募集は2024年6月6日(木)から始まっており、2024年7月8日(月)まで受け付けています
Allow one to set strict_loading_mode globally by gjtorikian · Pull Request #51339 · rails/rails · GitHub
ActiveRecordに関する変更です
第16回で紹介したstrict_loadingモードに関連する変更がされています
https://listen.style/p/tanaken-on-rails/hlkj6fds
ActiveRecord::Base#pluck accepts hash values, devcontainers improvements and more! | This Week in Rails#6623621e4492e80000a3301e
strict_loadingモードはレコードが関連付けを遅延読み込みしようとしたときの振る舞いを制御するものです
:all を指定するとすべての遅延読み込みをエラーとし、:n_plus_one_only を指定するとN+1が発生するような遅延読み込みをエラーとします
このstrict_loadingモードはアプリケーション全体で有効/無効を切り替えることができます
https://railsguides.jp/configuring.html#config-active-record-strict-loading-by-default
3.8.29 config.active_record.strict_loading_by_default
strict_loadingモードをデフォルトで有効にするか無効にするかを指定するboolean値です。デフォルト値はfalseです。
ただし、有効にしたときに適用されるstrict_loadingのモードは :all のみでした
つまり :n_plus_one_only をアプリケーション全体に指定する手段がない、という状況でした
今回のプルリクエストでは、この状況に対して config.active_record.strict_loading_mode という設定を追加し :n_plus_one_only も指定できるようにしました
この設定項目のデフォルト値は :all です
Defer route drawing to the first request, or when url_helpers called. by gmcgibbon · Pull Request #52012 · rails/rails · GitHub
railtiesに関する変更です
ルーティングの描画を最初のリクエスト、または、url_helpersが呼ばれるまで遅延する仕組みが実装されました
これまではrails runner、テスト、rake taskの実行などの際にも常にルーティングの描画をする仕組みになっていました
中にはルーティングが不要なシーンにもあります
たとえばrails runnerであるモデルのあるレコードのデータを参照するだけ、など
ルーティングがたくさんあるアプリケーションにおいては、ルーティングの描画に時間がかかるので、この時間を削減したい、というモチベーションでこのプルリクエストが出されたようです
プルリクエストには、この実装前後でルーティングが2000件あるアプリケーションのrails runnerの実行結果が記載されていました
code:before.sh
% time bin/rails runner ""
bin/rails runner "" 0.66s user 0.33s system 95% cpu 1.036 total
code:after.sh
% time bin/rails runner ""
bin/rails runner "" 0.47s user 0.32s system 98% cpu 0.791 total
この実験結果では、約0.2秒の高速化がされています